package com.bdqn.sys.controller;


import com.alibaba.fastjson.JSON;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.bdqn.common.utitls.*;
import com.bdqn.sys.entity.Role;
import com.bdqn.sys.entity.User;
import com.bdqn.sys.service.RoleService;
import com.bdqn.sys.service.UserService;
import com.bdqn.sys.vo.LoginUserVo;
import com.bdqn.sys.vo.UserVo;
import org.apache.shiro.SecurityUtils;
import org.apache.shiro.authc.AuthenticationException;
import org.apache.shiro.authc.UsernamePasswordToken;
import org.apache.shiro.subject.Subject;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestMapping;

import org.springframework.web.bind.annotation.RestController;

import javax.annotation.Resource;
import javax.servlet.http.HttpSession;
import java.util.*;

/**
 * <p>
 *  前端控制器
 * </p>
 *
 * @author KazuGin
 * @since 2020-04-23
 */
@RestController
@RequestMapping("/sys/user")
public class UserController {

    @Resource
    private UserService userService;

    @Resource
    private RoleService roleService;

    /**
     * 登录
     * @param loginname
     * @param loginpwd
     * @param session
     * @return
     */
    @PostMapping("/login")
    public JSONResult LoginUser(String loginname, String loginpwd, HttpSession session){
        //获取当前登录主体得到当前用户信息
         Subject subject = SecurityUtils.getSubject();
        try {
            //创建令牌
            UsernamePasswordToken token=new UsernamePasswordToken(loginname,loginpwd);
            //调用登录方法 用主体调用主体自带login方法
            subject.login(token);
            //获取当前登录信息
            LoginUserVo loginUserVo = (LoginUserVo) subject.getPrincipal();

            //清楚ssession中保存的密码
            loginUserVo.getUser().setLoginpwd(null);

            //保存session  第一个参数是key  第二个参数是value
            session.setAttribute(SystemConstants.LOGIN_USER,loginUserVo.getUser());
            //返回成功状态
            return SystemConstants.LOGIN_SUCCESS;
        } catch (AuthenticationException e) {
            e.printStackTrace();
        }
        return SystemConstants.LOGIN_ERROR;
    }

    /**
     * 查询员工列表
     * @param userVo
     * @return
     */
    @RequestMapping("/list")
    public DateGindViewResult list(UserVo userVo){
        //分页对象
        IPage<User> page=new Page<User>(userVo.getPage(),userVo.getLimit());

        //调用查询用户信息的方法
        userService.findUserListByPage(page,userVo);
        //返回数据
        return  new DateGindViewResult(page.getTotal(),page.getRecords());
    }


    @GetMapping("/loadUserByDeptId")
    public DateGindViewResult loadUserByDeptId(Integer deptid){
        QueryWrapper<User> queryWrapper = new QueryWrapper<User>();
        //根据部门编号查询
        queryWrapper.eq("deptid",deptid);
        //查询
        List<User> userList = userService.list(queryWrapper);
        //返回数据
        return new DateGindViewResult(userList);
    }


    /**
     * 检查用户名是否存在
     * @param loginname
     * @return
     */
    @RequestMapping("/checkLoginName")
    public  String checkLoginName(String loginname){
        Map<String,Object> map=new HashMap<String, Object>();
        QueryWrapper<User> queryWrapper = new QueryWrapper<User>();
        //根据部门编号查询
        queryWrapper.eq("loginname",loginname);
        //调用方法
        if (userService.count(queryWrapper)>0){
            map.put(SystemConstants.EXIST,true);
            map.put(SystemConstants.MESSAGE,"登录名称已存在");
        }else {
            map.put(SystemConstants.EXIST,false);
            map.put(SystemConstants.MESSAGE,"登录名称可以使用");
        }

        return JSON.toJSONString(map);
    }


    /**
     * 添加用户的
     * @param user
     * @return
     */
    @RequestMapping("/addUser")
    public  JSONResult addUser(User user){
        String salt= UUIDUtil.randomUUID();
        user.setSalt(salt);//加密盐值
        user.setLoginpwd(PasswordUtil.md5(SystemConstants.DEFAULT_PASSWORD,salt,SystemConstants.HASHITERATIONS ));//设置密码
        user.setHiredate(new Date()); //入职时间

        user.setType(SystemConstants.USER_TYPE_normal);//用户类型创建一开始是普通用户

        if (userService.save(user)){
            return  SystemConstants.Add_SUCCESS; //添加成功
        }
            return  SystemConstants.Add_ERROR; //添加失败
    }

    /**
     * 修改用户的
     * @param user
     * @return
     */
    @RequestMapping("/updateUser")
    public  JSONResult updateUser(User user){
        if (userService.updateById(user)){
            return  SystemConstants.UPDATE_SUCCESS; //添加成功
        }
        return  SystemConstants.UPDATE_ERROR; //添加失败
    }

    /**
     * 根据用户id查询用户详细信息
     * @param id
     * @return
     */
    @RequestMapping("/loadUserById")
    public  DateGindViewResult loadUserById(int id){
        return  new DateGindViewResult(userService.getById(id));
    }


    /**
     * 删除用户
     * @param id
     * @return
     */
    @RequestMapping("/deleteById")
    public  JSONResult deleteById(Integer id){
        if (userService.removeById(id)){
            return SystemConstants.DELETE_SUCCESS;
        }
        return SystemConstants.DELETE_ERROR;
    }

    /**
     * 根据用户ID查询角色信息
     * @param id
     * @return
     */
    @RequestMapping("/initRoleListByUserId")
    public DateGindViewResult initRoleListByUserId(Integer id){
        QueryWrapper<Role> queryWrapper=new QueryWrapper<Role>();
        //查询所有角色信息
        List<Map<String, Object>> mapsList = roleService.listMaps(queryWrapper);
        //查询当前用户拥有的角色列表
        Set<Integer> roleIdList=userService.findUserRoleByUserId(id);
        //循环遍历
        for (Map<String,Object> objectMap : mapsList) {
            //定义变量，标记是否选中
            Boolean   LAY_CHECKED=false;//默认不选中
            //获取当前用户拥有的角色Id
            int roleId= (int) objectMap.get("id");//id是主键 以主键为map集合中key

            //内层循环，判断当前拥有哪些角色，拥有的角色要选中
            for (Integer rid: roleIdList) {
                if (rid==roleId){
                    LAY_CHECKED=true;//拥有选中
                    break;
                }
            }
            //标记选中
            objectMap.put("LAY_CHECKED",LAY_CHECKED);

        }
        //返回数据
        return new DateGindViewResult(Long.valueOf(mapsList.size()),mapsList);


    }

    @PostMapping("/saveUserRole")
    public  JSONResult saveUserRole(Integer userId,String roleIds){
        if(userService.saveUserRole(userId,roleIds)){
            return SystemConstants.DISTRIBUTE_SUCCESS;
        }
        return SystemConstants.DISTRIBUTE_ERROR;
    }
}

